格式转换直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件。因为不需要进行视音频的编码和解码,所以不会有视音频的压缩损伤。
主要步骤如下:
- 注册初始化
1 | av_register_all(); |
- 打开输入文件,获取视频相关信息
1 | avformat_open_input() |
- 初始化输出文件的AVFormatContext并copy输入文件AVFormatContext的相关设置,打开输出文件
1 | //为输出格式分配AVFormatContext |
- 写入数据到文件
1 | //将文件流头部数据写入文件 |
- 回收
具体代码和步骤如下:
1 |
|
遇到的错误:
错误C4996 ‘xxxx’: 被申明已否决
原因: 因为api已经过时
解决: 建议换用新的api,或者在属性->c/c++->常规里面关闭SDL检查H.264 bitstream malformed, no startcode found, use the video bitstream filte
原因:主要是因为使用了mp4中的h264编码,而h264有两种封装:
一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中;另一种是mp4模式,一般mp4、mkv、avi会没有startcode,SPS和PPS以及其它信息被封装在container中,每一个frame前面是这个frame的长度,很多解码器只支持annexb这种模式,因此需要将mp4做转换;在ffmpeg中用h264_mp4toannexb_filter可以做转换;所以需要使用-bsf h264_mp4toannexb来进行转换;
解决:
(1) 注册过滤器
1 | AVBitStreamFilterContext *filter = av_bitstream_filter_init("h264_mp4toannexb"); |
(2) 在获取第一帧的时候进行处理
1 | if (pkt.stream_index == 0) { |
参考:
ffmpeg实战教程(四)格式转换如MP4转MKV等
H.264 bitstream malformed, no startcode found, use the video bitstream filte错误解决方法